package com.pagepub.core.exception;

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;

import com.pagepub.core.utils.SystemCfgHelper;
import com.pagepub.core.utils.SystemUtil;

public class BaseException extends RuntimeException{
	protected List<String> errorsMessageLst = new ArrayList<String>();

	public BaseException(ExceptionMessageParam emp,Throwable e)
	{
		super(e);
		try
		{
			if (emp.isMessage())// 直接显示错误信息
			{
				if (emp.getParams() != null && emp.getParams().length > 0)
				{
					String msg = MessageFormat.format(emp.getKeyOrMessageText(), emp.getParams());
					errorsMessageLst.add(msg);
				}
				else
				{
					errorsMessageLst.add(emp.getKeyOrMessageText());
				}
			}
			else
			// 从资源文件中取

			{
				if (emp.getParams() != null && emp.getParams().length > 0)
				{
					// 有带参数
					if (emp.getResFileName() != null && emp.getResFileName().length() > 0)//指定资源文件
					{
						String msg = MessageFormat.format(getLocalResourceStr(emp.getKeyOrMessageText(), emp
								.getResFileName()), emp.getParams());
						errorsMessageLst.add(msg);
					}
					else//使用默认资源文件
					{
						String msg = MessageFormat.format(getLocalResourceStr(emp.getKeyOrMessageText(),
								SystemCfgHelper.getDefaultResource()), emp.getParams());
						errorsMessageLst.add(msg);
					}
				}
				else
				{
					// 不带参数
					if (emp.getResFileName() != null && emp.getResFileName().length() > 0)//指定资源文件
					{
						String msg = getLocalResourceStr(emp.getKeyOrMessageText(), emp.getResFileName());
						errorsMessageLst.add(msg);
					}
					else//使用默认资源文件
					{
						String msg = getLocalResourceStr(emp.getKeyOrMessageText(),SystemCfgHelper.getDefaultResource());
						errorsMessageLst.add(msg);
					}
				}
			}
		}
		catch (Exception e1)
		{
			e1.printStackTrace();

		}

	}

	/**
	 * 为异常处理类提供所有的错误信息，第一个为最外层异常,第二个为...(错误层一般分为present、service、persist)
	 * 该错误处理框架的所有错误信息放在默认的(appres.properties)proterties文件errorkey=errorMsg中

	 * 
	 * @return
	 */
	public BaseException()
	{
		super();
	}

	public BaseException(Throwable e)
	{
		super(e);
	}

	public List<String> getErrorsMessageLst()
	{
		if (errorsMessageLst.size() == 0)
		{
			return null;
		}
		return errorsMessageLst;
	}

	/**
	 * 可带参数的错误信息 在appres.proterties中有错误信息为:error.xxxx.xxx={0}这是错误的{1}
	 * 象错误信息有带参数的可以用此构造

	 */
	public BaseException(Throwable e, String resourceKeyName, Object... resourceParameter)
	{
		super(getLocalResourceStr(resourceKeyName), e);
	}

	/**
	 * 可带参数的错误信息（可以指定资源文件名） 在appres.proterties中有错误信息为:error.xxxx.xxx={0}这是错误的{1}
	 * 象错误信息有带参数的可以用此构造

	 * 
	 * @param e
	 * @param resourceName
	 * @param resourceKeyName
	 * @param resourceParameter
	 */
	public BaseException(Throwable e, String resourceName, String resourceKeyName, Object... resourceParameter)
	{
		super(getLocalResourceStr(resourceKeyName, resourceName), e);
	}

	/**
	 * 一般的错误信息构造

	 * 
	 * @param resourceKeyName
	 *            properties文件中的keyname
	 * @param e
	 */
	public BaseException(String resourceKeyName, Throwable e)
	{
		super(getLocalResourceStr(resourceKeyName), e);
	}

	/**
	 * 没有Throwable类的异常构造

	 * 
	 * @param resourceKeyName
	 */
	public BaseException(String resourceKeyName)
	{
		super(getLocalResourceStr(resourceKeyName));
	}

	/**
	 * 获取资源文件信息，如果从appres.properties文件中未找到msg的keyvalue则msg作为错误信息
	 * 
	 * @param msg
	 * @return
	 */
	protected static String getLocalResourceStr(String msg)
	{
		String str = SystemUtil.getFrameworkDefaultResourceValue(msg);
		if (str == null || str.length() == 0)
		{
			return msg;
		}
		return str;
	}

	/**
	 * 获取资源文件信息，如果从resourceName文件中未找到msg的keyvalue则msg作为错误信息
	 * 
	 * @param msg
	 * @param resFileName
	 * @return
	 */
	protected static String getLocalResourceStr(String msg, String resFileName)
	{
		String str = SystemUtil.getFrameworkResourceValue(msg, resFileName);
		if (str == null || str.length() == 0)
		{
			return msg;
		}
		return str;
	}

	/**
	 * 添加错误信息
	 * 
	 * @param msg
	 */
	public void addErrorsMessage(String msg)
	{
		errorsMessageLst.add(msg);
	}

	/**
	 * 添加错误信息(从默认的资源文件[appres.properties]取key的信息)
	 * 
	 * @param key
	 */
	public void addErrorsMessageByResource(String key)
	{
		errorsMessageLst.add(getLocalResourceStr(key));
	}

	/**
	 * 添加错误信息(从resourceName的资源文件取key的信息)
	 * 
	 * @param key
	 * @param resFileName
	 */
	public void addErrorsMessageByResource(String key, String resFileName)
	{
		errorsMessageLst.add(getLocalResourceStr(key, resFileName));
	}
}
